{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "35946ae8-e36a-42f8-b171-a85b38439182",
   "metadata": {},
   "source": [
    "# 1.图像和视频的加载和显示"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "64fca18d7ae03b9c",
   "metadata": {},
   "source": [
    "## 4.1窗口创建和销毁"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "initial_id",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-11-30T07:45:48.102216Z",
     "start_time": "2024-11-30T07:45:48.067093Z"
    }
   },
   "outputs": [],
   "source": [
    "import cv2"
   ]
  },
  {
   "cell_type": "raw",
   "id": "ac10304b1af90467",
   "metadata": {},
   "source": [
    "python函数编码规范，单词首字母小写，单词与单词之间用下划线连接wait_key"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "ac33b3c114a7b9bb",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-11-30T07:45:49.130359Z",
     "start_time": "2024-11-30T07:45:48.882237Z"
    }
   },
   "outputs": [],
   "source": [
    "#创建窗口\n",
    "cv2.namedWindow('window', cv2.WINDOW_NORMAL)#创建窗口，参数有窗口名字,flag\n",
    "cv2.resizeWindow('window', 640, 480)#更改窗口的大小\n",
    "cv2.imshow('window',0)#展示名字为window的窗口\n",
    "#等待按键\n",
    "#waitKey会返回按键的ascii的值\n",
    "#o表示接受任意按键，如果给其它的整数，表示等待按键的时间，单位是毫秒\n",
    "key=cv2.waitKey(0)\n",
    "#可以利用waitkey来销毁窗口，不用每次都重启python\n",
    "#key是int型，最少都是16位，但ascii码是8位,取出后8位\n",
    "if key&0xFF ==ord('q'):#&是按位与\n",
    "    print('准备销毁窗口')\n",
    "    cv2.destroyAllWindows()"
   ]
  },
  {
   "cell_type": "raw",
   "id": "a6f416647dcb6656",
   "metadata": {},
   "source": [
    "#怎么计算q的ascii码\n",
    "#ord是python中计算ascii值的函数\n",
    "ord('q')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8bc2a07377fbbdf1",
   "metadata": {},
   "source": [
    "## 4-2读取图片"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "10bab331703823f5",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-11-30T07:45:53.413274Z",
     "start_time": "2024-11-30T07:45:53.408853Z"
    }
   },
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "a1a41aaa71aa3b1b",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-11-30T07:45:54.000925Z",
     "start_time": "2024-11-30T07:45:53.987065Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[[255, 255, 255],\n",
       "        [255, 255, 255],\n",
       "        [255, 255, 255],\n",
       "        ...,\n",
       "        [255, 255, 255],\n",
       "        [255, 255, 255],\n",
       "        [255, 255, 255]],\n",
       "\n",
       "       [[255, 255, 255],\n",
       "        [255, 255, 255],\n",
       "        [255, 255, 255],\n",
       "        ...,\n",
       "        [255, 255, 255],\n",
       "        [255, 255, 255],\n",
       "        [255, 255, 255]],\n",
       "\n",
       "       [[255, 255, 255],\n",
       "        [255, 255, 255],\n",
       "        [255, 255, 255],\n",
       "        ...,\n",
       "        [255, 255, 255],\n",
       "        [255, 255, 255],\n",
       "        [255, 255, 255]],\n",
       "\n",
       "       ...,\n",
       "\n",
       "       [[255, 255, 255],\n",
       "        [255, 255, 255],\n",
       "        [255, 255, 255],\n",
       "        ...,\n",
       "        [255, 255, 255],\n",
       "        [255, 255, 255],\n",
       "        [255, 255, 255]],\n",
       "\n",
       "       [[255, 255, 255],\n",
       "        [255, 255, 255],\n",
       "        [255, 255, 255],\n",
       "        ...,\n",
       "        [255, 255, 255],\n",
       "        [255, 255, 255],\n",
       "        [255, 255, 255]],\n",
       "\n",
       "       [[255, 255, 255],\n",
       "        [255, 255, 255],\n",
       "        [255, 255, 255],\n",
       "        ...,\n",
       "        [255, 255, 255],\n",
       "        [255, 255, 255],\n",
       "        [255, 255, 255]]], dtype=uint8)"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#默认是按照彩色图片来读取的\n",
    "cat=cv2.imread(r'D:\\Users\\ZTC\\Pictures\\1myplot.png')#输入是图片和方式，方式是黑白，彩色等\n",
    "cat#返回值是numpy中的ndarray"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b42afb20-d183-4e44-8178-95539c1f596d",
   "metadata": {},
   "source": [
    "cv2.imshow(winname, mat)  \n",
    "winname (字符串)：指定要创建的窗口的名称。窗口名称必须是唯一的，如果你使用相同的名称调用 imshow()，它将在同一个窗口中更新图像。  \r\n",
    "mat (NumPy 数组)：要显示的图像数据。图像应该是一个多维数组（通常是 NumPy 数组），其中每个元素代表图像中的一个像素。对于彩色图像，数组形状通常是 (height, width, channels)，而对于灰度图像，数组形状是 (height, width)  \n",
    "通常mat是imread的返回值。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "94eb7950-5a3b-4666-9f18-48b495210267",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-11-30T07:45:55.298222Z",
     "start_time": "2024-11-30T07:45:55.022506Z"
    }
   },
   "source": [
    "发现matplotlib显示的图片和真实的图片颜色不一样，因为opencv读进来的图片数据通道不是默认的RGB。  \n",
    "opencv读取的图片颜色通道是按照BGR(蓝绿红)排列的。所以一般opencv读进来的图片不要用别方式去展示，比如matplotlib。  \n",
    "用opencv自己的方式去展示就没有问题"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "3e1f4586-0380-4fe3-a400-41217ea6f0dd",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-11-30T07:45:55.298222Z",
     "start_time": "2024-11-30T07:45:55.022506Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.image.AxesImage at 0x2126c06e8d0>"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.imshow(cat)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "3ba8d4626c960bef",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "准备销毁窗口\n"
     ]
    }
   ],
   "source": [
    "cv2.imshow('cat',cat)\n",
    "key=cv2.waitKey(0)\n",
    "#可以利用waitkey来销毁窗口，不用每次都重启python\n",
    "#key是int型，最少都是16位，但ascii码是8位,取出后8位\n",
    "if key&0xFF ==ord('q'):#&是按位与\n",
    "    print('准备销毁窗口')\n",
    "    cv2.destroyAllWindows()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "5756ccea-7ecb-42f8-a987-362fc00cec21",
   "metadata": {},
   "outputs": [],
   "source": [
    "#把展示图片的代码封装成函数，方便重用\n",
    "def cv_show(name,img):\n",
    "    cv2.imshow(name,img)\n",
    "    key=cv2.waitKey(0)\n",
    "    if key&0xFF ==ord('q'):#&是按位与\n",
    "        print('准备销毁窗口')\n",
    "        cv2.destroyAllWindows()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "ce6e669d-7d2e-468f-9054-cc03b05c684d",
   "metadata": {},
   "outputs": [],
   "source": [
    "from utils import cv_show#从外部py文件中导入工具类，必须在同一个文件夹"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "a9a5e112-b0dd-4ed7-91c1-541351ea8bd4",
   "metadata": {},
   "outputs": [],
   "source": [
    "%run utils.py"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "d452fcee-cd90-4ad2-8e40-94be6581b9cf",
   "metadata": {},
   "outputs": [],
   "source": [
    "cv_show('cat',cat)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fc724e0c-65f3-4506-8824-52df477b9a3d",
   "metadata": {},
   "source": [
    "## 4-3保存图片"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f64dad51-7e44-4597-a31d-d59fec5bd6c2",
   "metadata": {},
   "source": [
    "cv2.imwrite(filename, img[, params])  \r\n",
    "filename (str): 图像将被保存的路径。它应该包含文件的完整路径、文件名以及扩展名（如 .png, .jpg, .bmp 等）。确保指定正确的文件格式，因为不同的格式可能有不同的特性，例如质量、压缩比等  。\r\n",
    "img (numpy.ndarray): 要保存的图像。这是一个 NumPy 数组，表示图像的数  据。\r\n",
    "params (optional, list of int): 用于控制图像编码参数的列表。这些参数依赖于所使用的特定图像格式。例如，对于 JPEG 文件，可以设置压缩质量；对于 PNG 文件，可以设置压缩级别。此参数是可选的，通常不需要  提供。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "640703a1-d799-4f51-a319-dcb52407f261",
   "metadata": {},
   "outputs": [],
   "source": [
    "import cv2\n",
    "\n",
    "#创建窗口\n",
    "cv2.namedWindow('img',cv2.WINDOW_NORMAL)\n",
    "cv2.resizeWindow('img',640,480)\n",
    "\n",
    "#读取图片\n",
    "img=cv2.imread(r'D:\\Users\\ZTC\\Pictures\\1myplot.png')\n",
    "\n",
    "while True:\n",
    "    cv2.imshow('img',img)#第一个是名字，第二个参数是图片\n",
    "    key=cv2.waitKey(0)#0表示键盘输入任何都可\n",
    "    if key==ord('q'):\n",
    "        break\n",
    "    elif key==ord('s'):\n",
    "        cv2.imwrite('./123.png',img)\n",
    "    else:\n",
    "        print(key)\n",
    "cv2.destroyAllWindows()\n",
    "    "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3ec10245-ddc7-4e8e-9eb5-6abe8d8ad094",
   "metadata": {},
   "source": [
    "## 4-4视频采集"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c292ba4b-a6c3-4231-acf7-7db18255b8d4",
   "metadata": {},
   "source": [
    "视频由图片组成，每一帧就是一幅图片，一般是30帧，表示1s显示30张图片。  \n",
    "cv2.VideoCapture可以捕获摄像头，用数字来表示不同的设备，比如0,1。  \n",
    "如果是视频文件，可以直接指定路径即可。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "dd970bc1-31e1-480f-9fe8-ee7be3f064a3",
   "metadata": {},
   "outputs": [],
   "source": [
    "#打开摄像头\n",
    "import cv2\n",
    "cv2.namedWindow('video',cv2.WINDOW_NORMAL)\n",
    "cv2.resizeWindow('video',640,480)\n",
    "\n",
    "#如果打开失败，不会报错，直接退出\n",
    "cap=cv2.VideoCapture(0)#打开摄像头 \n",
    "\n",
    "#循环读取摄像头的每一帧\n",
    "#while True:\n",
    "while cap.isOpened():#如果打开成功，返回True\n",
    "    #读一帧数据，返回标记和这一数据。True表示读到了数据，False表示没读到数据\n",
    "    ret,frame=cap.read()\n",
    "\n",
    "    #可以根据ret做个判断\n",
    "    if not ret:\n",
    "        #没读到数据，直接退出\n",
    "        break\n",
    "    #显示数据\n",
    "    cv2.imshow('video',frame)\n",
    "\n",
    "    key=cv2.waitKey(10)\n",
    "    if key&0xFF==ord('q'):\n",
    "        break\n",
    "#别忘了释放资源\n",
    "cap.release()\n",
    "cv2.destroyAllWindows()\n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "45813898-1494-434b-ae40-e6e8e4d6bc02",
   "metadata": {},
   "outputs": [],
   "source": [
    "#打开本地视频\n",
    "import cv2\n",
    "cv2.namedWindow('video',cv2.WINDOW_NORMAL)\n",
    "cv2.resizeWindow('video',640,480)\n",
    "#如果打开失败，不会报错，直接退出\n",
    "#打开视频，输入视频的地址\n",
    "cap=cv2.VideoCapture(r'D:\\Users\\ZTC\\Pictures\\test_traffic.mp4')#打开摄像头 \n",
    "\n",
    "#循环读取摄像头的每一帧\n",
    "#while True:\n",
    "while cap.isOpened():#如果打开成功，返回True\n",
    "    #读一帧数据，返回标记和这一数据。True表示读到了数据，False表示没读到数据\n",
    "    ret,frame=cap.read()\n",
    "\n",
    "    #可以根据ret做个判断\n",
    "    if not ret:\n",
    "        #没读到数据，直接退出\n",
    "        break\n",
    "    #显示数据\n",
    "    cv2.imshow('video',frame)\n",
    "    #假如一个视频是30帧，那么每张图要间隔1000/30毫秒\n",
    "    #只能是整数\n",
    "    key=cv2.waitKey(1000//30)#每隔10ms下一帧图片，看起来加速了\n",
    "    if key&0xFF==ord('q'):\n",
    "        break\n",
    "#别忘了释放资源\n",
    "cap.release()\n",
    "cv2.destroyAllWindows()\n",
    "    "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6ad4a6e4-cc21-49b4-aacd-598754d2a27f",
   "metadata": {},
   "source": [
    "## 4-5视频录制"
   ]
  },
  {
   "cell_type": "raw",
   "id": "04cfc64e-5b76-4e93-a499-79a129f1383b",
   "metadata": {},
   "source": [
    "video_writer = cv2.VideoWriter(  \n",
    "    filename,        # 输出视频文件的路径（包括文件名和扩展名）  \n",
    "    fourcc,          # 编码器的四字符代码 (FOURCC)  \n",
    "    fps,             # 视频的帧率 (frames per second)  \n",
    "    frameSize,       # 帧的大小 (宽度, 高度)，以像素为单位  \n",
    "    isColor=None     # 是否是彩色视频（默认为 True）  \n",
    ")  \n",
    "filename (str): 输出视频文件的路径。确保路径有效，并且程序有权限在该路径下创建文件。  \n",
    "fourcc (int): 四字符代码 (FOURCC)，表示视频编解码器。常见的编码器包括：  \n",
    "    cv2.VideoWriter_fourcc(*'XVID'): Xvid 编码器，适用于 .avi 文件。  \n",
    "    cv2.VideoWriter_fourcc(*'MJPG'): Motion JPEG 编码器，适用于 .avi 和 .mp4 文件。  \n",
    "    cv2.VideoWriter_fourcc(*'MP4V'): MPEG-4 编码器，适用于 .mp4 文件。  \n",
    "    cv2.VideoWriter_fourcc(*'H264'): H.264 编码器，适用于 .mp4 文件。需要注意的是，某些平台上可能需要额外安装 H.264 编解码器。  \n",
    "fps (float): 视频的帧率，即每秒显示的帧数。常见的帧率为 24、30 或 60。  \n",
    "frameSize (tuple): 每一帧的尺寸，格式为 (宽度, 高度)，单位为像素。确保所有写入的帧都具有相同的尺寸。  \n",
    "isColor (bool, optional): 是否是彩色视频。如果为 True，则每一帧应为三通道图像（BGR）；如果为 False，则每一帧应为单通道灰度图像。默认值为 True。  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "4270533a-590a-4768-af26-71471b4feebe",
   "metadata": {},
   "outputs": [],
   "source": [
    "cap=cv2.VideoCapture(0)#打开摄像头\n",
    "fourcc=cv2.VideoWriter_fourcc(*'mp4v')\n",
    "\n",
    "#创建videowriter\n",
    "vw=cv2.VideoWriter('output.mp4',fourcc,30,(640,480))\n",
    "\n",
    "while cap.isOpened():\n",
    "    ret,frame=cap.read()\n",
    "    if not ret:\n",
    "        break\n",
    "    #写每一帧数据\n",
    "    vw.write(frame)\n",
    "    cv2.imshow('frame',frame)#不用namedWindow，会自动创建窗口命名frame\n",
    "    if cv2.waitKey(1000//30)==ord('q'):\n",
    "        break\n",
    "#别忘了realease\n",
    "cap.release()\n",
    "vw.release()\n",
    "cv2.destroyAllWindows()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4c0309de-7086-4ba4-b08d-22fcb0ab687c",
   "metadata": {},
   "source": [
    "## 4-6控制鼠标"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8adb1bea-786c-4b39-a840-426e21866d28",
   "metadata": {},
   "source": [
    "OpenCV允许我们对窗口上的鼠标动作做出响应.  \n",
    "• setMouseCallback( winname, callback, userdata) winname是窗口的名字, callback是回调函数, userdata是给回调函数的参数.    \n",
    "• callback( event,x,y, flags, userdata)回调函数必须包含这5个参数.event是事件(鼠标移动,左键,右键，x,y是点鼠标的坐标点, flags主要用于组合键, userdata就是上面的setMouseCallback的 userdata\n",
    "鼠标事件：   \n",
    "○ EVENT_MOUSEMOVE0 鼠标移动  \n",
    "○ EVENT_LBUTTONDOWN1 按下鼠标左键  \n",
    "○ EVENT_RBUTTONDOWN 2 按下鼠标右键  \n",
    "○ EVENT_MBUTTONDOWN 3按下鼠标中键  \n",
    "○ EVENT_LBUTTONUP4 左键释放  \n",
    "○ EVENT_RBUTTONUP5 右键释放  \n",
    "○ EVENT_MBUTTONUP6 中键释放  \n",
    "。EVENT_LBUTTONDBLCLK7左键双击  \n",
    "o EVENT_RBUTTONDBLCLK 8右键双击  \n",
    "○ EVENT_MBUTTONDBLCLK 9 中键双击  \n",
    "○ EVENT_MOUSEWHEEL 10 鼠标滚轮上下滚动  \n",
    "○ EVENT_MOUSEHWHEEL 11 鼠标左右滚动  \n",
    "flags:  \n",
    "○ EVENT_FLAG_LBUTTON 1 按下左键  \n",
    "○ EVENT_FLAG_RBUTTON 2 按下右键  \n",
    "○ EVENT_FLAG_MBUTTON 4按下中键  \n",
    "○ EVENT_FLAG_CRTLKEY 8 按下 ctrl键  \n",
    "○ EVENT_FLAG_SHIFTKEY 16 按下 shift键  \n",
    "○ EVENT_FLAG_ALTKEY  32 按下 alt键  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "b09270c1-ac8f-4ba9-80a9-cf100c62c78f",
   "metadata": {},
   "outputs": [],
   "source": [
    "#opencv控制鼠标\n",
    "import cv2\n",
    "import numpy as np\n",
    "\n",
    "#函数名随便取，但是参数必须是5个\n",
    "def mouse_callback(event,x,y,flags,userdata):\n",
    "    print(event,x,y,flags,userdata)\n",
    "#创建窗口\n",
    "cv2.namedWindow('mouse',cv2.WINDOW_NORMAL)\n",
    "cv2.resizeWindow('mouse',640,360)#宽度，高度\n",
    "\n",
    "#设置鼠标回调函数\n",
    "cv2.setMouseCallback('mouse',mouse_callback,'123')\n",
    "\n",
    "#生成全黑的图片\n",
    "img=np.zeros((360,640,3),np.uint8)\n",
    "while True:\n",
    "    cv2.imshow('mouse',img)\n",
    "    key=cv2.waitKey(1)\n",
    "    if key==ord('q'):\n",
    "        break\n",
    "cv2.destroyAllWindows()\n",
    "#结果0 592 100 0 123。0是鼠标移动，592、100是鼠标坐标，0是flag，没有组合事件。123是数据"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "982b9f6f-5732-4cf7-93c3-758af037527c",
   "metadata": {},
   "source": [
    "## 4-7TrackBar控件"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "75e7926e-80cf-49af-aa50-118bbca0219e",
   "metadata": {},
   "source": [
    "createTrackbar( trackbarname, winname, value, count,onChange) #创建TrackBar控件, value为 trackbar的默认值, count为 bar的最大值,最小为0  \n",
    "getTrackbarPos( trackbarname, winname) #获取TrackBar当前值  "
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "cc961611-75cf-43cc-a623-5f96c7d9ec18",
   "metadata": {},
   "source": [
    "在 OpenCV 中，cv2.createTrackbar 函数用于创建滑动条（trackbar），它通常与窗口结合使用，以提供用户交互功能。例如，你可以用滑动条来调整图像的亮度、对比度，或者控制视频播放的位置等。下面我将详细介绍 cv2.createTrackbar 的使用方法和参数。  \n",
    "函数：色版本\r\n",
    "cv2.createTrackbar(trackbarName, windowName, value, count, onCh。  \n",
    "nge)\r\n",
    "trackbarName：滑动条的名称，字符串类型。这是用来标识滑动。  \n",
    "唯一名称。\r\n",
    "windowName：滑动条所属的窗口名称，字符串类型。该窗口必须已经通过 cv2.namedWind。  \n",
    "() 创建。\r\n",
    "value：滑动条的初始位置，整数类型。这个值应该在 0 到 。  \n",
    "unt 之间。\r\n",
    "count：滑动条的最大值，整数类型。滑动条的最小值总是 0，因此范围是从 。  \n",
    "到 count。\r\n",
    "onChange：当滑动条位置改变时调用的回调函数。这个函数应该接受一个参数，即滑动条的新位置。如果你不想使用回调函数，可以传递 Non  e 或者一个空函数。一个空函数。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "73147720-82ea-44ae-b433-a3ce6003cec3",
   "metadata": {},
   "outputs": [],
   "source": [
    "#trackbar的使用\n",
    "import cv2 \n",
    "import numpy as np\n",
    "\n",
    "#创建窗口\n",
    "cv2.namedWindow('trackbar',cv2.WINDOW_NORMAL)\n",
    "cv2.resizeWindow(\"trackbar\",640,480)#宽和高\n",
    "\n",
    "#定义回调\n",
    "def callback(value):\n",
    "    #print(value)\n",
    "    pass\n",
    "\n",
    "#创建3个trackbar\n",
    "cv2.createTrackbar('R','trackbar',0,255,callback)#trackbarname,winname\n",
    "cv2.createTrackbar('G','trackbar',0,255,callback)\n",
    "cv2.createTrackbar('B','trackbar',0,255,callback)\n",
    "\n",
    "#创建背景图片\n",
    "img=np.zeros((480,640,3),np.uint8)\n",
    "\n",
    "while True:\n",
    "    #获取当前trackbar的值\n",
    "    r=cv2.getTrackbarPos('R','trackbar')#参数trackbarname,winname\n",
    "    g=cv2.getTrackbarPos('G','trackbar')\n",
    "    b=cv2.getTrackbarPos('B','trackbar')\n",
    "\n",
    "    #用获取到的三个值修改图片颜色\n",
    "    \"\"\"img[:] = [255, 0, 0]：这行代码将图像中的每个像素都设置为 [255, 0, 0]，即蓝色。由于 img 是一个\n",
    "        三维数组（高度、宽度、颜色通道），img[:] 会自动应用到所有像素。\n",
    "       img[:,:] 是显式地指定了两个维度的切片操作，表示选择数组中的所有行和所有列。它明确地告诉 NumPy 你\n",
    "       只关心前两个维度（即高度和宽度），而不涉及第三个维度（颜色通道）。\"\"\"\n",
    "    img[:]=[b,g,r]\n",
    "    cv2.imshow('trackbar',img)\n",
    "    key=cv2.waitKey(1)\n",
    "    if key ==ord('q'):\n",
    "        break\n",
    "cv2.destroyAllWindows()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "40730f91-db84-450d-a9d1-060adc8d85fd",
   "metadata": {},
   "source": [
    " # 2.OpenCV基础知识和绘制图形\n",
    " "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4b4ae682-2e22-4c17-9af9-8d701ec894d3",
   "metadata": {},
   "source": [
    "# 2-1 OpenCV的色彩空间\n",
    "最常见的色彩空间就是RGB,，人眼也是基于RGB的色彩空间去分辨颜色的。  \r\n",
    "OpenCV默认使用的是BGR. BGR和RGB色彩空间的区别在于图片在色彩通道上的排列顺序不。."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f9f053d7-3fbf-4854-8385-c6d1bf9c9e1f",
   "metadata": {},
   "source": [
    "2.1.2 HSV，HSL，YUV \n",
    "\n",
    "· OpenCV用的最多的色彩空间是HSV（也叫HSB）。\r\n",
    "\r\n",
    "· Hue：色相，即色彩，如红色，蓝色。用角度度量， 取值范围为0°-360°,从红色开始按逆时针方向计算， 红色为0°,绿色为120°,蓝色为240°\n",
    "\n",
    "。· Saturation：饱和度，表示颜色接近光谱色的程度。一种颜色， 可以看成是某种光谱色与白色混合的结果。其中光谱色所占的比例愈大， 颜色接近光谱色的程度就愈高， 颜色的饱和度也就愈高。饱和度高， 颜色则深而艳。光谱色的白光成分为0， 饱和度达到最高。通常取值范围为(0%∼100%,值越大， 颜色越饱和。\r\n",
    "\r\n",
    "Value(Brightness)：明度.明度表示颜色明亮的程度， 对于光源色， 明度值与发光体的光亮度有关； 对于物体色， 此值和物体的透射比或反射比有关。通常取值范围为0% (黑) 到100% (白)0% (白)自)。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "139e1130-046e-4716-a781-340ada4fd909",
   "metadata": {},
   "source": [
    "### 2.1.3 色彩空间的转换"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d929ed37-3355-465d-a327-1777fd98dcde",
   "metadata": {},
   "source": [
    "cvtColor(img,colorspace) #颜色空间的转换"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "4ceef4dc-c2dc-46bc-9936-f7aef89e58f4",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "0acd6341-418f-4a42-be50-15388c6e6b9a",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "63f1da0b-2997-4a8f-ba87-6165923e2d0e",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f3c2ba6f-49d9-428e-bd24-480ab07e42b3",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "yolov8",
   "language": "python",
   "name": "yolov8"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
